package l1j.server.server.clientpackets;

import java.util.logging.Level;
import java.util.logging.Logger;

import l1j.opqlo.Server.L1World.L1World;
import l1j.opqlo.Server.L1World.WorldClan;
import l1j.server.Config;
import l1j.server.echo.ClientThread;
import l1j.server.server.model.L1Clan;
import l1j.server.server.model.Instance.L1PcInstance;
import l1j.server.server.serverpackets.S_CharTitle;
import l1j.server.server.serverpackets.S_ServerMessage;


/**
 * 處理收到由客戶端傳來變更稱號的封包
 */
public class C_Title extends ClientBasePacket {

	private static final String C_TITLE = "[C] C_Title";
	private static Logger _log = Logger.getLogger(C_Title.class.getName());

	private void changeTitle(L1PcInstance pc, String title) {
		final int objectId = pc.getId();
		pc.setTitle(title);
		pc.sendPackets(new S_CharTitle(objectId, title));
		pc.broadcastPacketAll(new S_CharTitle(objectId, title));
		try {
			pc.save(); // DBにキャラクター情報を書き迂む
		} catch (final Exception e) {
			_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
		}
	}

	@Override
	public String getType() {
		return C_TITLE;
	}

	private boolean isClanLeader(L1PcInstance pc) {
		boolean isClanLeader = false;
		if (pc.getClanid() != 0) { // クラン所属
			final L1Clan clan = WorldClan.get().getClan(pc.getClanname());
			if (clan != null) {
				if (pc.isCrown() && pc.getId() == clan.getLeaderId()) { // 君主、かつ、血盟主
					isClanLeader = true;
				}
			}
		}
		return isClanLeader;
	}

	@Override
	public void start(final byte[] decrypt, final ClientThread client) {
		try {
			// 資料載入
			this.read(decrypt);

			final L1PcInstance pc = client.getActiveChar();
			if (pc == null) {
				return;
			}

			final String charName = this.readS();
			if(charName == null){
				return;
			}
			final String title = this.readS();
			if(title == null){
				return;
			}
			if (charName.isEmpty() || title.isEmpty()) {
				// \f1次のように入力してください：「/title \f0キャラクター名 呼称\f1」
				pc.sendPackets(new S_ServerMessage(196));
				return;
			}
			final L1PcInstance target = L1World.getInstance().getPlayer(charName);
			if (target == null) {
				return;
			}

			if (pc.isGm()) {
				this.changeTitle(target, title);
				return;
			}

			if (this.isClanLeader(pc)) { // 血盟主
				if (pc.getId() == target.getId()) { // 自分
					if (pc.getLevel() < 10) {
						// \f1血盟員の場合、呼称を持つにはレベル10以上でなければなりません。
						pc.sendPackets(new S_ServerMessage(197));
						return;
					}
					this.changeTitle(pc, title);
				} else { // 他人
					if (pc.getClanid() != target.getClanid()) {
						// \f1血盟員でなければ他人に呼称を与えることはできません。
						pc.sendPackets(new S_ServerMessage(199));
						return;
					}
					if (target.getLevel() < 10) {
						// \f1%0のレベルが10未満なので呼称を与えることはできません。
						pc.sendPackets(new S_ServerMessage(202, charName));
						return;
					}
					this.changeTitle(target, title);
					final L1Clan clan = WorldClan.get().getClan(pc.getClanname());
					if (clan != null) {
						for (final L1PcInstance clanPc : clan.getOnlineClanMember()) {
							// \f1%0が%1に「%2」という呼称を与えました。
							clanPc.sendPackets(new S_ServerMessage(203, pc
									.getName(), charName, title));
						}
					}
				}
			} else {
				if (pc.getId() == target.getId()) { // 自分
					if (pc.getClanid() != 0 && !Config.CHANGE_TITLE_BY_ONESELF) {
						// \f1血盟員に呼称を与えられるのはプリンスとプリンセスだけです。
						pc.sendPackets(new S_ServerMessage(198));
						return;
					}
					if (target.getLevel() < 40) {
						// \f1血盟員ではないのに呼称を持つには、レベル40以上でなければなりません。
						pc.sendPackets(new S_ServerMessage(200));
						return;
					}
					this.changeTitle(pc, title);
				} else { // 他人
					if (pc.isCrown()) { // 連合に所属した君主
						if (pc.getClanid() == target.getClanid()) {
							// \f1%0はあなたの血盟ではありません。
							pc.sendPackets(new S_ServerMessage(201, pc
									.getClanname()));
							return;
						}
					}
				}
			}
		} catch (final Exception e) {
			_log.log(Level.SEVERE, e.getLocalizedMessage(), e);

		} finally {
			this.over();
		}
	}

}
